package com.niiwoo.civet.trade.dto.response.myloan;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.Date;

import com.niiwoo.civet.trade.enums.ProjectStatusEnum;
import com.niiwoo.civet.trade.enums.ProjectSubStatusEnum;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class LoanGoingResponseDTO implements Serializable {
    private static final long serialVersionUID = 1108824261300434799L;

    /**
     * 标的ID
     */
    private Long projectId;

    /**
     * 标的名称
     */
    private String projectTitle;

    /**
     * 发布时间
     */
    private Date publishTime;

    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 提交时间
     */
    private Date submitTime;
    /**
     * 满标时间
     */
    private Date fullSuccessTime;


    /**
     * 当前期数
     */
    private Integer currentPeriod;

    public Integer getCurrentPeriod() {
        if (currentPeriod != null) {
            return currentPeriod - 1;
        }
        return currentPeriod;
    }

    /**
     * 总期数
     */
    private Integer totalPeriod;

    /**
     * 还款日期
     */
    private Date refundDate;

    /**
     * 还款状态1:未还款,2:已还款
     */
    private Byte refundStatus;

    public Byte getRefundStatus() {
        return refundStatus == null ? null : (refundStatus == 1 ? (byte) 1 : (byte) 2);
    }

    /**
     * 还款状态
     */
    private Byte repayStatus;

    /**
     * 业务类型
     */
    private Byte type;

    /**
     * 标的状态
     * 项目状态 （1审核中、2筹款中、3还款中、4已结清、5流标 ）
     */
    private Byte status;

    /**
     * 标的子状态
     * 100审核中-初始，101审核中-借款退回，102自动审核-通过，103自动审核-人工审核，104人工审核-通过，105审核通过待确认（融360有），200筹款中-初始，201筹款中-放款中,300还款中-正常还款中，301还款中-逾期还款中，302还款中-坏账还款中，400已结清-正常，401已结清-提前结清，402已结清-坏账结清，500流标-自动审核不通过，501流标-人工审核不通过，502流标-借款退回超时未确认，503流标-借款人手动取消，504流标-投资超时，505流标-后台管理人员手工流标）
     */
    private Integer subStatus;

    /**
     * 银行卡号
     */
    private String bankCard;

    /**
     * 离开应还款日期剩余天数
     */
    private Integer days;
    /**
     * 应还金额
     */
    private BigDecimal totalAmount;
    private BigDecimal capital;
    private BigDecimal interest;
    private BigDecimal managementFee;
    private BigDecimal penaltyFee;
    private BigDecimal guaranteeFee;
    /**
     * 提示文案
     */
    private String msg;

    /**
     * 利率
     */
    private BigDecimal borrowRate;

    /**
     * 期数
     */
    private BigDecimal deadline;

    /**
     * 期数单位
     */
    private Byte deadlineUnit;

    /**
     * 标的申请来源（1、APP，2、H5活动，3、H5极速借, 4、融360）
     */
    private Byte fromSource;

    private String channelCode;

    /**
     * 标的金额
     */
    private BigDecimal contractAmount;

    /**
     * 已投金额
     */
    private BigDecimal investedAmount;

    /**
     * 合同查看地址
     */
    private String viewUrl;

    /**
     * 极速借或者信用借,1:极速借, 2:信用借
     */
    private Byte borrowType = 1;

    /**
     * H5Url
     */
    private String h5Url;

    /**
     * 还款动作状态1可执行还款，2还款正在执行中
     */
    private Byte canRefund;
    /**
     * 是否支持代扣
     */
    private Boolean isSupportWithhold;
    /**
     * 上一期时间
     */
    private Date previousRefundDate;



    /*public Byte getChannelCode() {
        return ChannelCodeEnum.enumOf(channelCode).getFinanceFlag();
    }*/

    public Integer getDays() {
//        if (this.refundDate == null) return 0;
//        
//        LocalDate today = LocalDate.now();
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(this.refundDate);
//        LocalDate refundDate = LocalDate.of(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH));
//        Long day = ChronoUnit.DAYS.between(today, refundDate);
//        return day.intValue();
		if (days == null)
			return 0;
		return days;
    }

    public BigDecimal getTotalAmount() {
        if (capital == null || interest == null || managementFee == null || penaltyFee == null || guaranteeFee == null) {
            return BigDecimal.ZERO;
        }
        if ((capital.add(interest).add(managementFee).add(penaltyFee).add(guaranteeFee).compareTo(BigDecimal.ZERO) <= 0)) {
        	return BigDecimal.ZERO;
        }
        if (this.refundStatus != 1) {
            return BigDecimal.ZERO;
        }
        return capital.add(interest).add(managementFee).add(penaltyFee).add(guaranteeFee);
    }

    public String getMsg() {
        if (status.byteValue() == ProjectStatusEnum.REPAYING.getStatus().byteValue()) {
            if (subStatus.intValue() == ProjectSubStatusEnum.REPAYING_INIT.getSubStatus()) {
                if (isSupportWithhold != null && isSupportWithhold){
                    return "正常还款中银行卡未开通代扣：请在还款日前将应还金额充值到你我账户，系统将自动扣除";
                }
                if (null != bankCard && bankCard.length() >= 4) {
                	return MessageFormat.format(ProjectSubStatusEnum.enumOf(subStatus).getMsg(), bankCard.substring(bankCard.length() - 4));
                } else {
                	return MessageFormat.format(ProjectSubStatusEnum.enumOf(subStatus).getMsg(), "");
                }
            } else if (subStatus.intValue() == ProjectSubStatusEnum.REPAYING_OVERDUE.getSubStatus() || subStatus.intValue() == ProjectSubStatusEnum.REPAYING_BAD.getSubStatus()) {
                return MessageFormat.format(ProjectSubStatusEnum.enumOf(subStatus).getMsg(), 0 - getDays());
            }

        }
        return ProjectSubStatusEnum.enumOf(subStatus).getMsg();
    }

}
